package thread;

import java.sql.SQLOutput;

/**
 * 线程提供了一个方法,可以协调线程之间的同步运行
 * 同步运行:线程之间的执行存在先后顺序.
 * 异步运行:线程之间的执行没有顺序,各干各的.
 * 多线程本身就是异步运行的,但是某些业务场景需要线程在特定节点完成同步运行,
 *
 * join方法允许一个线程在该方法所属线程上等待(阻塞),直到其运行完毕后方可
 * 接触阻塞执行后续的代码.
 */
public class JoinDemo {
    //表示图片是否下载完毕
    public static boolean isFinish;

    public static void main(String[] args) {
        /*
            java语法要求:
            一个方法的局部内部类中若引用了这个方法的其他局部变量时
            该变量必须是final的.JDK8之后可以不显示的声明出来,但是该要求
            仍然成立
         */
//        final boolean isFinish = false;
        Thread download = new Thread() {
            public void run(){
                System.out.println("down:开始下载图片...");
                for (int i = 0; i < 100; i++) {
                    System.out.println("down:"+i+"%");
                    try {
                        Thread.sleep(50);
                        if (i>=99){
                            Thread.sleep(5000);
                        }
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                }
                System.out.println("down:图片下载完毕!");
                isFinish = true;//表示图片下载完了!
            }
        };
        Thread show = new Thread(){
            public void run(){
                System.out.println("show:开始显示文字...");
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("show:显示文字完毕!");
                System.out.println("show:开始显示图片...");
                //先等待dpwnload执行完毕(图片下载完毕)
                try {
                    System.out.println("show:等待download下载...");
                    download.join();
                    System.out.println("show:等待完毕!");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if (!isFinish){
                    throw new RuntimeException("加载图片失败!");
                }
                System.out.println("show:显示图片完毕!");
            }
        };
        download.start();
        show.start();
    }
}
